/**
 * 装饰器, 本质是一个方法
 * ts里面使用装饰器，需要调整  tsconfig.json里面的配置  "experimentalDecorators": true  需要开启
 */

// 入门

// 类装饰器： 顾明思议， 装饰器作用于 class

function decorators(target: any) {
  // console.log(target -- 指向的是 Base的构造方法)

  target.prototype.name = '张三'
  console.log('2. 无参 - 装饰器执行了')
}

// 类装饰器在 node_modules/typescript/lib/lib.decorators.legacy.d.ts  声明文件如下
// declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;

function f2(params: number) {
  console.log('1. 第二个装饰器，可以传参的装饰器执行了', params)

  return function (target: any) {
    target.prototype.age = params
  }
}

@f2(12)
@decorators
class Base {
  static say() {
    console.log('静态方法')
  }

  constructor() {
    console.log(
      '3. constructor 执行 ',
      '使用 decorators 方法装饰了 Base 类， 并给Base类添加了一些自定义内容'
    )
  }

  hi() {
    console.log('实例方法')
  }
}

const b: any = new Base()

console.log('通过装饰器添加上的 属性age --->', b.age)

// console.log(b.name)
// Base.say()

// b.hi()

//  ----------------------
